#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main() {
  Mat src = imread("../images/2.jpg");
  if (src.empty()) {
    cout << "could not load image.." << endl;
    return -1;
  }
  namedWindow("opencv setup demo", CV_WINDOW_AUTOSIZE);
  imshow("opencv setup demo", src);

  Mat dst1, dst2, dst3, dst4, dst5, dst6;

  char src_title1[] = "image1";
  char src_title2[] = "image2";
  char src_title3[] = "image3";
  char src_title4[] = "image4";
  char src_title5[] = "image5";
  char src_title6[] = "image6";
  // // robert x 增大x方向差异
  // Mat kernel1 = (Mat_<int>(2, 2) << 1, 0, 0, -1);
  // filter2D(src, dst1, -1, kernel1, Point(-1, -1), 0.0);
  // imshow(src_title1, dst1);
  // // robert y　增大y方向差异
  // Mat kernel2 = (Mat_<int>(2, 2) << 0, 1, -1, 0);
  // filter2D(src, dst2, -1, kernel2, Point(-1, -1), 0.0);
  // imshow(src_title2, dst2);

  // // sobel x
  // Mat kernel3 = (Mat_<int>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);
  // filter2D(src, dst3, -1, kernel3, Point(-1, -1), 0.0);
  // imshow(src_title3, dst3);
  // // sobely
  // Mat kernel4 = (Mat_<int>(3, 3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);
  // filter2D(src, dst4, -1, kernel4, Point(-1, -1), 0.0);
  // imshow(src_title4, dst4);

  // // 拉普拉斯算子
  // Mat kernel5 = (Mat_<int>(3, 3) << 0, -1, 0, -1, 4, -1, 0, -1, 0);
  // filter2D(src, dst5, -1, kernel5, Point(-1, -1), 0.0);
  // imshow(src_title5, dst5);

  int c = 0;
  int index = 0;
  int ksize = 3;
  while (true) {
    c = waitKey(500);
    if ((char)c == 27) {
      break;
    }
    ksize = 4 + (index % 5) * 2 + 1;
    Mat kernel = Mat::ones(Size(ksize, ksize), CV_32F) / (float)(ksize * ksize);
    filter2D(src, dst6, -1, kernel, Point(-1, -1));
    index++;
    imshow(src_title6, dst6);
  }

  waitKey(0);
  return 0;
}